package org.loda.service;

import java.util.ArrayList;
import java.util.List;

import org.loda.model.Request;
import org.loda.model.Response;
import org.loda.util.ConfigReader;

/**
 * 
* @ClassName: FilterChain 
* @Description: 过滤器链 
* @author minjun
*
 */
public class FilterChain {

	//存放所有的过滤器
	private List<Filter> filters = new ArrayList<Filter>();
	
	private int index;

	public FilterChain() {
	}

	public FilterChain(List<Filter> filters) {
		this.filters = filters;
	}
	
	/**
	 * 
	* @Title: readConfig 
	* @Description: 读取配置文件中过滤器信息（可根据需求选择性调用该方法）  
	* @param @param path 配置文件路径
	* @param @return    设定文件 
	* @return FilterChain    返回类型 
	* @throws
	 */
	public FilterChain readConfig(String path){
		List<String> str=ConfigReader.read(path);

		for(String s:str){
			try {
				Filter f=(Filter) Class.forName(s).newInstance();
				filters.add(f);
			} catch (Exception e) {
				throw new RuntimeException("找不到这个过滤器，请检查配置文件中过滤器的配置");
			}
		}
		return this;
	}
	
	/**
	 * 
	* @Title: readConfig 
	* @Description:
	*  读取配置文件中过滤器信息（可根据需求选择性调用该方法）  
	*  没有参数表示默认读取classpath下的名为filter.xml的配置文件
	* @param @return 
	* @return FilterChain    返回类型 
	* @throws
	 */
	public FilterChain readConfig(){
		return readConfig(null);
	}

	//添加过滤器
	public FilterChain addFilter(Filter filter) {
		filters.add(filter);
		return this;
	}

	//删除过滤器
	public FilterChain removeFilter(Filter filter) {
		filters.remove(filter);
		return this;
	}

	//执行过滤器
	public void doFilter(Request request, Response response) {
		//如果已经到达最后的过滤器，则返回
		if(index>=filters.size()) return;
		
		//否则调用下一个过滤器
		filters.get(index++).doFilter(request, response,this);
	}

}
